package cn.schoolwow.quickflow.service.flowContext.getData;

import cn.schoolwow.quickflow.domain.FlowContext;
import cn.schoolwow.quickflow.dto.FlowContextDataRange;
import com.alibaba.fastjson.TypeReference;

import java.util.Map;

public interface FlowContextGetDataOperation {
    /**
     * 检查数据是否存在,不存在时抛出异常
     */
    FlowContext isDataNotExist(String key, String message);

    /**
     * 判断key是否存在
     */
    boolean containKey(String key);

    /**
     * 判断实例是否存在
     */
    boolean containInstanceKey(Class clazz);

    /**
     * 获取上下文数据,不存在时抛出异常
     */
    Object checkData(String key);

    /**
     * 获取上下文数据,不存在时抛出异常
     */
    <T> T checkData(String key, Class<T> clazz);

    /**
     * 获取上下文数据,不存在时抛出异常
     */
    <T> T checkData(String key, TypeReference<T> typeReference);

    /**
     * 获取上下文实例,不存在时抛出异常
     */
    <T> T checkInstanceData(Class<T> clazz);

    /**
     * 获取上下文数据
     */
    Object getData(String key);

    /**
     * 获取上下文数据
     */
    <T> T getData(String key, Class<T> clazz);

    /**
     * 获取上下文数据
     */
    <T> T getData(String key, TypeReference<T> typeReference);

    /**
     * 获取上下文数据
     */
    Object getData(String key, Object defaultValue);

    /**
     * 获取上下文数据
     */
    <T> T getData(String key, Class<T> clazz, T defaultValue);

    /**
     * 获取上下文实例数据
     */
    <T> T getInstanceData(Class<T> clazz);

    /**
     * 获取上下文实例数据
     */
    <T> T getInstanceData(Class<T> clazz, T defaultValue);

    /**
     * 获取流程全局数据
     */
    Map<String, Object> getContextDataMap();

    /**
     * 获取加载流程配置数据
     */
    Map<String, Object> getFlowConfigDataMap();

    /**
     * 获取流程执行中间数据
     */
    Map<String, Object> getFlowExecuteDataMap();

    /**
     * 获取整个流程数据
     */
    Map<String, Object> getDataMap();

    /**
     * 获取流程请求数据
     */
    Map<String, Object> getRequestDataMap();

    /**
     * 获取线程上下文数据
     */
    Map<String, Object> getThreadLocalDataMap();

    /**
     * 获取当前流程数据
     */
    Map<String, Object> getCurrentFlowDataMap();

    /**
     * 获取当前复合流程数据
     */
    Map<String, Object> getCurrentCompositeFlowDataMap();

    /**
     * 获取key的作用域范围
     */
    FlowContextDataRange getFlowContextDataRangeByKey(String key);

    /**
     * 获取实例数据的作用域范围
     */
    FlowContextDataRange getFlowContextDataRangeByInstance(Class clazz);

    /**
     * 打印上下文变量作用域信息
     */
    void printFlowDataRange();
}
